/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import connection.AbstractConnection;
import entidades.Entrada;
import entidades.Funcionario;
import entidades.Uf;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 *
 * @author Ricardo
 */
public class FuncionarioDAO extends AbstractDAO {

    private final String sqlFuncionario =
            "select p.idpessoa,p.nome,p.telefone,p.email,p.endereco,p.cidade,p.uf_iduf,pf.cpf,pf.rg,pf.sexo,pf.estado_civil,f.dtadmissao,f.senha from pessoa p inner join pessoa_fisica pf on pf.pessoa_idpessoa=p.idpessoa inner join funcionario f on f.pessoa_fisica_pessoa_idpessoa=p.idpessoa where ";

    public FuncionarioDAO(AbstractConnection conn) {
        super(conn);
    }

    public Funcionario getFuncionarioByEmail(String email)
            throws SQLException {

        return getFuncionario(sqlFuncionario + "p.email=?;", email);

    }

    public Funcionario getFuncionarioById(int id)
            throws SQLException {

        return getFuncionario(sqlFuncionario + "p.idpessoa=?;", new Integer(id));

    }

    private Funcionario getFuncionario(String sql, Object whatFind)
            throws SQLException {

        Funcionario func = null;
        PreparedStatement ps =
                conn.getConnection().prepareStatement(sql);

        if (whatFind instanceof String) {
            ps.setString(1, (String) whatFind);
        } else if (whatFind instanceof Integer) {
            ps.setInt(1, (Integer) whatFind);
        }

        ResultSet rs = ps.executeQuery();

        if (rs == null) {
            return null;
        }

        while (rs.next()) {
            func = preencheFuncionario(rs);
        }

        conn.closeConnection();

        return func;
    }

    private Funcionario preencheFuncionario(ResultSet rs) throws SQLException {
        Funcionario func = new Funcionario();

        func.setId(rs.getInt("idpessoa"));
        func.setNome(rs.getString("nome"));
        func.setTelefone(rs.getString("telefone"));
        func.setEmail(rs.getString("email"));
        func.setEndereco(rs.getString("endereco"));
        func.setCidade(rs.getString("endereco"));
        func.setUf(getUf(rs));
        func.setCpf(rs.getString("cpf"));
        func.setRg(rs.getString("rg"));
        func.setSexo(rs.getString("sexo"));
        func.setEstadoCivil(rs.getString("estado_civil"));
        func.setSenha(rs.getString("senha"));
        func.setDataAdmissao(rs.getDate("dtadmissao"));
        func.setEntradas(getEntradas(rs));

        return func;
    }

    private Uf getUf(ResultSet rs) throws SQLException {
        Uf uf = (new UfDAO(getNewConnection())).encontraUf(rs.getString("uf_iduf"));
        return uf;
    }

    private List<Entrada> getEntradas(ResultSet rs) throws SQLException {
        List<Entrada> entradas = (new EntradaDAO(getNewConnection())
                .getEntradaByFuncionario(rs.getInt("idpessoa")));
        return entradas;
    }
}
